#include "KEY_STD_Config.h"

/**
    ******************************************************************************
    * 函数名称：KEY_STD_Config
    * 功能描述：初始化按键引脚（PE4）和外部中断
    * 输入参数：无
    * 返回值  ：无
    * 详细说明：
    * 1. 配置PE4为浮空输入模式
    * 2. 设置EXTI4为下降沿触发
    * 3. 配置NVIC中断优先级为最低（0x0F）
    * 硬件要求：
    * - 按键一端接PE4，另一端接地
    * - 需外部上拉电阻（通常4.7kΩ-10kΩ）
    * - 按键按下时产生下降沿中断
    * 调用示例：
    *   KEY_STD_Config();
    *   // 需自行实现EXTI4_IRQHandler中断服务函数
    ******************************************************************************
**/
void KEY_STD_Config(void)
{
    EXTI_InitTypeDef EXTI_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    /* 开启GPIOE时钟 */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);

    /* 配置PE4为浮空输入 */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOE, &GPIO_InitStructure);

    /* 开启AFIO时钟（用于外部中断线配置） */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

    /* 将PE4映射到EXTI4 */
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource4);

    /* 配置EXTI4 */
    EXTI_InitStructure.EXTI_Line = EXTI_Line4;            // 选择中断线4
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;  // 中断模式
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; // 下降沿触发
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;            // 使能中断线
    EXTI_Init(&EXTI_InitStructure);                       // 应用配置

    /* 配置NVIC（嵌套向量中断控制器） */
    NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;      // 外部中断4
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F; // 抢占优先级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;  // 子优先级
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;       // 使能中断
    NVIC_Init(&NVIC_InitStructure);                       // 应用配置
}

